也許各位與我一樣,是個生活在這個社會上某個角落裡的平凡工程師,日復一日地堆積出這個社會運轉所必須的軟體及服務。然而我們不是一個人單獨地生活、單獨地工作、單獨地居住。總是有可愛的家人,有真誠的同事,有主管,有老闆。
但這社會上,還是有一些人,他們的存在,是從另一個方向,給予我們成長的動力。他們喜歡按他們所好來使用軟體,或是喜歡不按牌理出牌地摸索這些軟體與服務,或者透過各樣的手法,使你臣服於黑暗的勢力。
我們要做的事,不是向這些人宣戰。而是要保護我們有價值的資料、客戶、服務、與生活。
我是一個很平凡的工程師,沒有好的學歷,沒有亮眼的證照,沒有焚膏繼晷的戰鬥力,沒有高人一等的才華。在平凡的日子裡,做著平凡的工作,只是總是要比以前多花點心力,來面對這世界越加嚴峻的安全挑戰。
這系列連載,是我這些年使用 Java 語言,在一個安全至上的開發環境裡,所累積出來的經驗。我不會強調華麗的設計模式與開發框架,有些東西是隨處境而異,或許會視情況使用。我會在此探索一些主題,是各位在 StackOverflow 上或許找的到的,或在 Java API Doc 裡會看得到的,也會在資安課上聽到的一些基本內容。但我們在此,對這些基本的內容可以進行深度地探討。
今天我們要先探討,什麼是資訊安全。
以前,記得我在學生時代,有個學長,是個寫病毒的高手。那時,我認為資安就是防毒與放毒之間的攻防。後來,在大學末幾年的日子,同學是學校 Server 的大總管,那時,我認為資安就是防止別人不要跳進我們的 Server 裡幹壞事。開始工作時,老闆說過 Authentication、Authroization、Messaging、Logging 是系統的四大要件,那時,我認為資安就是讓對的人有對的權限做事。
直到今年,上了些課程,好讓我可以在頭幾天拿出來說個嘴。
當你談到安全時,你第一個想到什麼呢?現在,我會想到「保護」。資訊安全的存在,正是為了保護該重要的、有價值的、你所珍惜的資訊內容、資產及服務流程。
談完了對資訊安全的主觀定義,我們要從業界對它的客觀定義繼續。
資訊安全(Information Security) 有幾項目標,就像你、我的每一項工作,有不同的目標,有些目標是一個具體的名詞,你完成了什麼,就得到了它。但資訊安全的目標是抽象的名詞,只有更高,沒有最高。
我想,這個是資訊安全之所以是資訊安全的關鍵之一,或許各位曾經使用過加密、解密的函式庫,但更常見的是,各位進入 Facebook、IT 邦幫忙、Gmail 都需要登入,有些服務登入流程很麻煩,相對的就讓你覺得安全性很高。於是,機密性目的就在於提供一個保護,防止沒有被授權的使用。
它談的東西很簡單,雖然手法千變萬化,但就僅僅「是」與「不是」。例如,當你打開大門,看見門外有一個人,你會下意識判斷這是不是你的家人。是,就讓他進來,不是,不讓他進來。
透過加密(Encryption),我們可以給盟友看見正常而完整的內容,給敵人看到一片亂碼。透過認證(Authentication),我們可以提供給會員 VIP 專屬的服務,或提供給客戶轉帳、刷卡等服務,而路人只能在旁邊流口水。
西方文化非常強調精確度(Accuracy),雖然 Johnny 的好朋友,或許會直接叫他 John。然而,這事情若放在有法律效力的文件、關乎生命與國家安全的資訊、有經濟價值的資料內容。那麼,一個一個 0 與 1 都要錙銖必較。因為,完整性就是要提供一個保護,防止沒有被授權的修改。
換句話說,你或許能看到這個資料,但你無法修改它。有人說,那把防寫鎖鎖上就好了嘛!(這句話透漏了我的年齡)但事實上並不是那麼簡單的一件事。因此,各位在安裝軟體時,謹慎一點的人,會驗證安裝檔的 Hash 值,再更謹慎的作法,是驗證它的發行人簽章。簽章驗證本身已經帶有 Hash 驗證的流程在內,但它更含括了機密性這項目標的作用在內。
透過授權(Authorization)的機制,我們把合適的權限給予合適的對象,於是我們可以確保資料的修改,必定是透過正規的管道來進行。
這個特性,出現在很多三合一理論裡,例如分散式系統的 CAP 理論的 A 也是可用性(Availability),足見它的重要性,是跨領域的。當然,你不會期望你花了半年寫出來的系統,一上線就被大量使用者灌爆,系統癱瘓,硬碟因大量讀寫而損毀,網路卡因流量大而燒壞。或許你應該去買台好一點的機器,或者聯絡一下業務,考慮買雲端的方案。
可用性在各個領域裡出現,只有一個原因:系統就是要給人用的、資料就是要給人讀的,因此你想用時,就能用;想讀時,就能讀。如果你千方百計,加密了一封極高安全性的信件,給你的密友,結果,他手頭上只有簡單的記事本,即便你把密碼給他,他也沒辦法解開這裡面奇妙的文字排列,除非你是寄給 John Nash,不然他讀不了,即使資料是機密的,也是完整的,卻是不可用的。
既然是談到 Java 的連載,我們勢必要寫程式,而且是不少程式。一切的程式,我會放在 GitHub 上面,不同主題的程式碼,會以不同的分支來存放。當這一系列連載結束時,我們會得到一個有用的 Java 安全工具組。